package com.zenithmind.common.utils;

import java.util.Map;

/**
 * 消息队列服务接口
 * 遵循依赖倒置原则：依赖抽象而非具体实现
 * 遵循接口隔离原则：只包含消息队列相关的操作
 */
public interface MessageQueueService {
    
    /**
     * 发送消息
     * 
     * @param topic 主题
     * @param message 消息内容
     * @return 是否发送成功
     */
    boolean sendMessage(String topic, String message);
    
    /**
     * 发送消息（带标签）
     * 
     * @param topic 主题
     * @param tag 标签
     * @param message 消息内容
     * @return 是否发送成功
     */
    boolean sendMessage(String topic, String tag, String message);
    
    /**
     * 发送消息（带属性）
     * 
     * @param topic 主题
     * @param tag 标签
     * @param message 消息内容
     * @param properties 消息属性
     * @return 是否发送成功
     */
    boolean sendMessage(String topic, String tag, String message, Map<String, String> properties);
    
    /**
     * 发送延时消息
     * 
     * @param topic 主题
     * @param tag 标签
     * @param message 消息内容
     * @param delayTimeLevel 延时等级
     * @return 是否发送成功
     */
    boolean sendDelayMessage(String topic, String tag, String message, int delayTimeLevel);
    
    /**
     * 发送顺序消息
     * 
     * @param topic 主题
     * @param tag 标签
     * @param message 消息内容
     * @param orderKey 顺序键
     * @return 是否发送成功
     */
    boolean sendOrderMessage(String topic, String tag, String message, String orderKey);
    
    /**
     * 发送事务消息
     * 
     * @param topic 主题
     * @param tag 标签
     * @param message 消息内容
     * @param transactionId 事务ID
     * @return 是否发送成功
     */
    boolean sendTransactionMessage(String topic, String tag, String message, String transactionId);
    
    /**
     * 批量发送消息
     * 
     * @param topic 主题
     * @param messages 消息列表
     * @return 发送结果
     */
    BatchSendResult sendBatchMessages(String topic, java.util.List<MessageRequest> messages);
    
    /**
     * 创建主题
     * 
     * @param topic 主题名称
     * @param queueNum 队列数量
     * @return 是否创建成功
     */
    boolean createTopic(String topic, int queueNum);
    
    /**
     * 删除主题
     * 
     * @param topic 主题名称
     * @return 是否删除成功
     */
    boolean deleteTopic(String topic);
    
    /**
     * 获取主题信息
     * 
     * @param topic 主题名称
     * @return 主题信息
     */
    TopicInfo getTopicInfo(String topic);
    
    /**
     * 消息请求
     */
    class MessageRequest {
        private String tag;
        private String message;
        private Map<String, String> properties;
        
        public MessageRequest(String tag, String message) {
            this.tag = tag;
            this.message = message;
        }
        
        public MessageRequest(String tag, String message, Map<String, String> properties) {
            this.tag = tag;
            this.message = message;
            this.properties = properties;
        }
        
        // Getters and Setters
        public String getTag() { return tag; }
        public void setTag(String tag) { this.tag = tag; }
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        public Map<String, String> getProperties() { return properties; }
        public void setProperties(Map<String, String> properties) { this.properties = properties; }
    }
    
    /**
     * 批量发送结果
     */
    class BatchSendResult {
        private int successCount;
        private int failureCount;
        private java.util.List<String> failedMessages;
        
        public BatchSendResult(int successCount, int failureCount, java.util.List<String> failedMessages) {
            this.successCount = successCount;
            this.failureCount = failureCount;
            this.failedMessages = failedMessages;
        }
        
        // Getters
        public int getSuccessCount() { return successCount; }
        public int getFailureCount() { return failureCount; }
        public java.util.List<String> getFailedMessages() { return failedMessages; }
    }
    
    /**
     * 主题信息
     */
    class TopicInfo {
        private String topicName;
        private int queueNum;
        private long messageCount;
        private java.time.LocalDateTime createTime;
        
        public TopicInfo(String topicName, int queueNum, long messageCount, java.time.LocalDateTime createTime) {
            this.topicName = topicName;
            this.queueNum = queueNum;
            this.messageCount = messageCount;
            this.createTime = createTime;
        }
        
        // Getters
        public String getTopicName() { return topicName; }
        public int getQueueNum() { return queueNum; }
        public long getMessageCount() { return messageCount; }
        public java.time.LocalDateTime getCreateTime() { return createTime; }
    }
}
